'use strict';
const { v4: uuidv4 } = require('uuid');
const { Service } = require('egg');
class BookService extends Service {
  async test() {
    return uuidv4();
  }
  // 添加图书的方法
  async addBook(bookObj) {
    const allBook = await this.app.model.Book.find({ isbn: bookObj.isbn });
    if (allBook.length === 0) {
      const model = new this.app.model.Book(bookObj);
      await model.save();
      return model;
    } else {
      return { code: 501, msg: '图书已存在' };
    }
  }
  // 删除图书的方法
  async deleteBook(isbn) {
    // 还要删除关于该书的借阅记录
    const data = await this.app.model.Book.remove({ isbn });
    await this.app.model.Borrow.remove({ isbn });
    if (data.n >= 1) {
      return { code: 200, data };
    } else {
      return { code: 501, msg: '删除失败' };
    }
  }
  // 修改图书的方法
  async updateBook(newBookObj) {
    const data = await this.app.model.Book.update({ isbn: newBookObj.isbn }, { $set: { bookName: newBookObj.bookName, bookPrice: newBookObj.bookPrice, bookCover: newBookObj.bookCover, imageList: newBookObj.imageList, author: newBookObj.author, bookPress: newBookObj.bookPress, bookInfo: newBookObj.bookInfo } });
    if (data.n >= 1) {
      return { code: 200, data };
    } else {
      return { code: 501, msg: '修改失败!!!' };
    }
  }
  // 根据isbn查询图书信息
  async findByIsbn(isbn) {
    const data = await this.app.model.Book.find({ isbn }); // 执行mongoose的查询语句
    if (data.length === 0) {
      return { code: 501, msg: '查找失败' };
    } else {
      return data[0];
    }
  }
  // 根据书籍名称查找图书
  async findByBookName(bookName) {
    const data = await this.app.model.Book.find({ bookName }); // 执行mongoose的查询语句
    if (data.length === 0) {
      return { code: 501, msg: '查找失败' };
    } else {
      return data;// 返回全部书籍
    }
  }
  // 查询全部图书信息
  async findAllBook() { // 查询全部用户
    const data = await this.app.model.Book.find({});
    return data;
  }
  // 分页查询图书信息 通过get方式 pagenumber是页数,limit是要显示的数量
  async limitBook(pagenumber, limit) {
    /**
     * 这里我们先来学习一下mongodb数据库查询
     * page1
     * db.test.find().limit(10);
     * page2
     * db.test.find().skip(10).limit(10);
     * ...
     * 上面的这种看起来已经实现了分页,但是官方不推荐,
     * 因为这样非常消耗性能.
     * 在数量巨大之后,解决方案是先查询当前页的第一条
     * 然后顺序数pageSize.
     * 正确的分页办法
     * page1
     * let data=db.test.find().limit(10);
     * const last_id=data[9]._id;//将最后一条数据的id获取并且保存
     * page2
     * db.test.find({'_id':{ $"gt": last_id }}).limit(10)
     * 通过 id 再次查询后面的10条数据
     * page 以此类推,保存最后一条数据的id,然后继续查询后面的10条数据
     * 由于我们写的项目数据不大,所以该项目暂时使用
     * db.test.find().skip(10).limit(10);
     */
    // 前端从 1 开始 每次查询limit条
    const number = parseInt((pagenumber - 1) * limit);
    const data = await this.app.model.Book.find({}).skip(number).limit(parseInt(limit)).sort({});
    if (data.length !== 0) {
      return data;
    } else {
      return { code: 201, data, msg: '数据显示完毕' };
    }
  }
}
module.exports = BookService;
